﻿using System;
using System.Runtime.InteropServices;

namespace IphoneTrackerDotNet
{
    class Dll
    {
        [DllImport("bplist.dll", EntryPoint = "bplist2xml_buffer", CallingConvention = CallingConvention.StdCall)]
        private static extern int bplist2xml_(byte[] ptr, int len, out IntPtr xmlPtr, bool useOpenStepEpoch);

        [DllImport("bplist.dll", EntryPoint = "bplist2xml_file", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        private static extern int bplist2xml_(string filename, out IntPtr xmlPtr, bool useOpenStepEpoch);

        [DllImport("bplist.dll", EntryPoint = "mdinfo", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int mdinfo(string filename, out string domain, out string path);

        // en C#, string et byte[] ne représentent pas la même chose: il y a la notion d'encoding dans une string,
        // (c'est forcément de l'Unicode), même marshalée depuis const char* d'une DLL non managée, qui est forcément
        // de l'ANSI
        // et ce n'est pas plus mal comme ainsi !
        public static int Bplist2Xml(byte[] ptr, int len, out byte[] xml, bool useOpenStepEpoch)
        {
            IntPtr xmlPtr;

            int xmlSize = bplist2xml_(ptr, len, out xmlPtr, useOpenStepEpoch);

            if (xmlSize != 0)
            {
                xml = new byte[xmlSize];
                Marshal.Copy(xmlPtr, xml, 0, xmlSize);
                Marshal.FreeCoTaskMem(xmlPtr);
            }
            else
            {
                xml = null;
            }

            return xmlSize;
        }


        public static int Bplist2Xml(string filename, out byte[] xml, bool useOpenStepEpoch)
        {
            IntPtr xmlPtr;

            int xmlSize = bplist2xml_(filename, out xmlPtr, useOpenStepEpoch);

            if (xmlSize != 0)
            {
                xml = new byte[xmlSize];
                Marshal.Copy(xmlPtr, xml, 0, xmlSize);
                Marshal.FreeCoTaskMem(xmlPtr);
            }
            else
            {
                xml = null;
            }

            return xmlSize;
        }
    }
}